\subsection{Umsetzung}
In diesem Abschnitt sollen erste Entscheidungen zur Umsetzung der im vor\-her\-igen vorgestellten Anforderungen gegeben werden. Da die Wahl der Programmiersprache neben der Wahl konkreter Bibliotheken auch teilweise die Umsetzung der Anforderungen beeinflusst, soll zun\"achst sie begr\"undet werden.

\subsubsection{Programmiersprache}
Zun\"achst ist zu bemerken, dass zur Implementierung von Compilern und Interpretern funktionale Programmiersprachen die beste Wahl darstellen. So kann durch die Verwendung von vor allem in funktionalen Programmiersprachen verwendeten Konzepten die Entwicklungszeit und die Komplexit\"at von Parsern und Lexern stark gesenkt werden. Beispielsweise ist es durch den Einsatz von Monaden in Haskell m\"oglich, die Implementierung von Hand durchzuf\"uhren \cite{Parsec}. In imperativen und objektorientierten Sprachen sind diese Aufgaben selbst f\"ur einfache Eingabesprachen so komplex, dass Parser- und Lexergeneratoren wie Lex und Yacc \cite{Lex} oder Antlr \cite{Antlr} verwendet werden m\"ussen.\\
Um die Erweiterbarkeit zu vereinfachen ist es weiter w\"unschenswert, dass der Quelltext leicht lesbar und einfach verst\"andlich ist. Neben der offensichtlichen Anforderung an den Programmierer ergibt sich daraus auch die Anforderung an die Programmiersprache, m\"oglichst weit verbreitet zu sein oder eine sehr ausdrucksstarke, einfach verst\"andliche Syntax zu haben und m\"oglichst wenige un\-n\"otige Codefragmente (boilerplate code) zu produzieren.\\
Da es weiter notwendig ist eine graphische Oberfl\"ache zu programmieren, ist die Verf\"ugbarkeit einer leicht zu erlernenden oder bereits bekannten Bibliothek zu diesem Zweck w\"unschenswert, da eine komplette Eigenentwicklung im Rahmen eines Individuellen Projekts nicht zu leisten ist. \\
Java ist zwar eine objektorientierte Sprache und damit f\"ur die Compiler- und Interpreterentwicklung weniger geeignet, durch den Einsatz von MakeJavaUseful (siehe Abschnitt \ref{subsubsec:MakeJavaUseful}) liessen sich aber viele Konzepte aus funktionalen Programmiersprachen verwenden. \\
Da sich Java in weiter Verbreitung befindet und die Lehrsprache der \cvo ist, kann sie auch die zweite Anforderung erf\"ullen. Java selbst ist zwar stark mit boilerplate code versetzt, durch den Einsatz von MakeJavaUseful kann aber auch hier zum Teil Abhilfe geschaffen werden.\\
F\"ur Java stehen durch die extrem weite Verbreitung zu fast jedem Einsatzgebiet eine Vielzahl von Bibliotheken bereit, darunter auch AWT und SWING, beide Teil der Standardbibliothek von Java und SWT, eine im Eclipseprojekt entstandene Bibliothek, die ebenfalls zur Erstellung von graphischen Oberfl\"achen dient.


\subsubsection{Graphische Darstellung}
Die Anforderung einer m\"oglichst originalgetreuen Darstellung der Diagramme ist als wichtiges Bewertungskriterium f\"ur die in Abschnitt \ref{subsec:ebib} evaluierten Bibliotheken eingeflossen.\\
Nachdem keine der untersuchten Bibliotheken zufriedenstellende Resultate liefern konnte, wurde hier eine Eigenentwicklung, die in Abschnitt \ref{sec:Implementierung} n\"aher beschreiben ist, verwendet.

\subsubsection{Animierbarkeit der Abl\"aufe}
Wie auch die Forderung nach m\"oglichst originalgetreuer Darstellung ist die Forderung der Animierbarkeit als wichtiges Evaluationskriterium f\"ur die Bibliotheken zur graphischen Darstellung eingeflossen.\\ 
Nachdem keine der in Abschnitt \ref{subsec:ebib} aufgef\"uhrten Bibliotheken zufriedenstellende Resultate liefern konnte, wurde bei der ohnehin geplanten Entwicklung auch auf eine m\"oglichst einfache Implementierung der Animierbarkeit hingearbeitet. 

\subsubsection{Leichte Erweiterbarkeit}
Um die leichte Erweiterbarkeit um neue Operationen und Animation sicherzustellen, wurde w\"ahrend der Entwicklung darauf geachtet, m\"oglichst viele Informationen \"uber Operationen und Animationen durch die in Java \"au\ss{}erst m\"achtige Reflection-API zu erhalten.\\
Weiter konnte durch die Verwendung von \textbf{MakeJavaUseful} (siehe Ab\-schnitt \ref{subsubsec:MakeJavaUseful}) -- genauer die Verwendung von Higher-Order-Functions -- der Aufwand f\"ur das Hinzuf\"ugen einer neuen Operation, je nach Komplexit\"at der Operation, auf wenige Codezeilen gesenkt werden. \\
Zu genaueren Erl\"auterung siehe Abschnitt \ref{subsec:Primitive}.

\subsubsection{Geeignetes Speicherformat}
Wie im vorherigen Abschnitt gefordert, musste ein geigenetes Speicherformat f\"ur Funktionsbibliotheken sowie f\"ur fertiggestellte Algorithmen entwickelt werden. Da Java verwendet wird, bietet sich die Verwendung des \textit{jar}-Formats an, welches auch bei Java genau zu diesem Zweck verwendet wird. Neben dem Programmcode selbst dienen die \textit{jar}-Dateien auch als Container f\"ur verwendete Res\-sour\-cen. \\
Der (kompilierte) Programmcode kann also wie bei Java-Programmen weiter in \textit{jar}-Dateien gelagert werden. Zus\"atzlich werden die zur graphischen Dar\-stellung einzelner Bausteine ben\"otigten Graphiken als Ressourcen gespeichert. Als drittes wird eine Datei ben\"otigt, die bei Funktionsbibliotheken die Verkn\"upfung zwischen funktionalem Baustein und Graphik, bei fertig\-ge\-stellten Algorithemen positionelle Daten und durch Verkn\"upfung kleinerer Bausteine entstandene neue Bausteine festh\"alt. F\"ur diese beiden Anforderungen bietet sich die Verwendung einer XML-Datei an, die ebenfalls als Res\-sour\-ce in der \textit{jar}-Datei gespeichert werden kann. XML selbst bietet sich an, da dessen Verwendung im Java-Umfeld durch sehr viele Bibliotheken unterst\"utzt wird. 

\subsubsection{Korrektheit der Programme}
Der korrekte Ablauf der erstellten Programme kann nur durch die ohnehin zu fordernde Korrektheit der Implementierung von \RENGA sichergestellt werden. Soweit dies m\"oglich war, wurden daher bei der Implementierung Testcases zu Sicherstellung der fehlerfreien Implementierung erstellt. 

\subsubsection{Geschwindigkeit}
Die Geschwindigkeit der Oberfl\"ache h\"angt vom Einsatz der oben genannten APIs und Techniken ab, so ist vor allem durch den starken Einsatz von Reflection mit grossen Geschwindigkeitseinbu\ss{}en zu rechnen. Es wurde daher bei der Implementierung darauf geachtet, m\"oglichst \"okonomisch Gebrauch von \glqq teuren\grqq\hspace{0.5ex} Operationen zu machen und deren Ergebnisse im Speicher vorzuhalten. 